package cn.op.portal.common.dao;

import java.util.List;

import cn.op.portal.common.vo.Page;

/**
 * 包含了基本基本增删改查方法的Dao接口
 * @author lufei
 * @param <T>
 */
public interface BaseDao<T> {
	
	/**添加一条数据
	 * @param sql sql语句
	 * @param values sql语句中的参数
	 */
	void add(String sql, Object...values);
	
	/**删除一条数据
	 * @param sql sql语句
	 * @param values sql语句中的参数
	 */
	void delete(String sql, Object...values);
	
	/**更新一条数据
	 * @param sql sql语句
	 * @param values sql语句中的参数
	 */
	void update(String sql, Object...values);
	
	/**查询一条记录
	 * @param sql sql语句
	 * @param values sql语句中的参数
	 * @return 返回当前dao关联的对象
	 */
	T findById(String sql, Object...values);
	
	/**分页查询
	 * @param sql sql语句
	 * @param pageNum 页码
	 * @param pageSize 每页记录数
	 * @param values sql查询参数
	 * @return 返回所要查询的记录的一个List
	 */
	List<T> findObjectList(String sql, int pageNum, int pageSize, Object...values);
	
	
	/**分页查询
	 * @param sql sql语句
	 * @param pageNum 页码
	 * @param pageSize 每页记录数
	 * @param values sql查询参数
	 * @return 返回一个Page对象，封装了所要查询的记录
	 * @throws Exception 
	 */
	Page<T> findPage(String sql, int pageNum, int pageSize, Object[] values) throws Exception;
	
	/**指定查询结果所要封装的对象的分页查询
	 * @param sql sql语句
	 * @param pageNum 页码
	 * @param pageSize 每页记录数
	 * @param R 用于封装查询结果的类
	 * @param values sql查询参数
	 * @return 返回所要查询的记录的一个List
	 */
	<R extends Object> List<R> findObjectList(String sql, int pageNum, int pageSize, Class R, Object[] values);

	/**指定查询结果所要封装的对象的分页查询
	 * @param sql sql语句
	 * @param pageNum 页码
	 * @param pageSize 每页记录数
	 * @param R 用于封装查询结果的类
	 * @param values sql查询参数
	 * @return 返回一个Page对象，封装了所要查询的记录
	 * @throws Exception 
	 */
	<R extends Object> Page<R> findPage(String sql, int pageNum, int pageSize, Class R, Object...values) throws Exception;
	
	/**获得所要查询的sql语句，所能查询出的总记录数，用于在分页查询之前调用
	 * @param sql sql语句
	 * @param values sql查询参数
	 * @return 总记录数
	 * @throws Exception 
	 */
	int getCount(final String sql, final Object... values) throws Exception;
}
